package 栈.middle;

import java.util.Stack;

/**
 * @author Lw中
 * @date 2020/10/19 13:52
 */
public class YiWuLing {

    /**
     * 逆波兰表达式求值
     * 使用栈进行计算表达式
     * @param tokens
     * @return
     */
    public static int evalRPN(String[] tokens) {
        // 栈用于存储数子字符
        Stack<Integer> stack = new Stack<>();
        // 两个整型变量用于接收栈中数字字符
        Integer op1, op2;
        // 遍历循环tokens字符串中字符
        for (String s : tokens) {
            switch (s) {
                // 若为+号，将栈中最上面的两个数取出相加之后再压栈
                case "+":
                    op1 = stack.pop();
                    op2 = stack.pop();
                    stack.push(op2 + op1);
                    break;
                // 若为-号，将栈中最上面的两个数取出相减之后再压栈
                case "-":
                    op1 = stack.pop();
                    op2 = stack.pop();
                    stack.push(op2 - op1);
                    break;
                // 若为*号，将栈中最上面的两个数取出相乘之后再压栈
                case "*":
                    op1 = stack.pop();
                    op2 = stack.pop();
                    stack.push(op2 * op1);
                    break;
                // 若为/号，将栈中最上面的两个数取出相除之后再压栈
                case "/":
                    op1 = stack.pop();
                    op2 = stack.pop();
                    stack.push(op2 / op1);
                    break;
                // 默认将数字字符压栈
                default:
                    stack.push(Integer.valueOf(s));
                    break;
            }
        }
        return stack.pop();
    }

    public static void main(String[] args) {
        String[] str = {"4", "13", "5", "/", "+"};
        int i = evalRPN(str);
        System.out.println(i);
    }

}
